package List.LinkList;


/**
 * 头节点不可用-单链表
 */
public class LinkListNoHead {

    private Node head = new Node(0);

    public void addHead(Node node) {
        node.next=head;
        head=node;
    }

    public void addEnd(Node node) {
        /*我们怎么去向一个单链表的末尾中添加节点呢？
            假设我们现在已有一个单链表了，既然我们要向其末尾加入一个节点，
            我们肯定要找到这个链表的末尾，怎么去找到这个链表的末尾呢？
            这里我们通过一个辅助变量来遍历这个节点
        */
        Node temp;
        temp = head;
        while (true) {
            if (temp.next != null) {
                temp = temp.next;
            } else {
                temp.next = node;
                break;
            }
        }
    }

    //删除链表中元素
    public void delNode(int intData) {
        Node temp;
        temp = head;

        //判断头节点
        if(temp.intData==intData){
            head=temp.next;
            return;
        }

        while (true) {
            if (temp.next.intData == intData) {
                //条件匹配，找到想要删除的节点
                temp.next = temp.next.next;
                break;
            } else {
                temp = temp.next;
                /*
                以下if语句是判断当没有匹配到想要删除的节点时的操作
                这里直接判断temp.next是否为空，为空就直接表示没有找到想要的删除的节点,
                不需要再判断temp指向的节点是否匹配想要删除的节点了，
                因为在这次的if_else中，if已经对最后一个节点进行检查过了，而且是不匹配才会转到else语句的
                */
                if (temp.next == null) {
                    System.out.println("没有找到想要删除的节点");
                    break;

                }
            }
        }
    }

    //改动链表中元素
    public void modifyNode(int intData, int _intData) {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next.intData == _intData) {
                temp.next.intData = _intData;
                break;
            } else {
                temp = temp.next;
                //与delNode()方法相同道理
                if (temp.next == null) {
                    System.out.println("没有找到想要修改的节点");
                    break;

                }

            }

        }
    }

    //查找节点，有则返回true,无则false
    public boolean checkNode(int intData) {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next.intData == intData) {
                return true;
            } else {
                temp = temp.next;
                //与delNode()方法相同道理
                if (temp.next == null) {
                    return false;

                }
            }


        }


    }

    public void show() {
        Node temp;
        temp = head;
        while (true) {
            if (temp.next == null) {
                System.out.println(temp);
                break;
            } else {
                System.out.println(temp);
                temp = temp.next;
            }
        }
        System.out.println();

    }

    //升序插入
    public void addAsc(int intData){

        if(intData < head.intData){
            Node temp = new Node(intData);
            temp.next=head;
            head=temp;
        }else{
            Node temp = head;
//            while (true) {
//                if (temp.next.intData   ) {
//                    //条件匹配，找到想要删除的节点
//                    temp.next = temp.next.next;
//                    break;
//                } else {
//                    temp = temp.next;
//                /*
//                以下if语句是判断当没有匹配到想要删除的节点时的操作
//                这里直接判断temp.next是否为空，为空就直接表示没有找到想要的删除的节点,
//                不需要再判断temp指向的节点是否匹配想要删除的节点了，
//                因为在这次的if_else中，if已经对最后一个节点进行检查过了，而且是不匹配才会转到else语句的
//                */
//                    if (temp.next == null) {
//                        System.out.println("没有找到想要删除的节点");
//                        break;
//
//                    }
//                }

        }

    }
}
